const request = require("request");
const cheerio = require("cheerio");
const xlsx = require("xlsx-populate");
const zlib = require("zlib");
// 获取亚马逊店铺的链接和商户ID
const marketplaceId = "ATVPDKIKX0DER"; // 可以使用浏览器检查工具获取商户ID和链接
const sellerId = "A10IJC42GEOLLK";
const storeUrl =
  "https://www.amazon.com/s?me=" + sellerId + "&marketplaceID=" + marketplaceId;

// 存储所有 ASIN 码的数组
let urls = ["B0C2QN786D"];
// 获取亚马逊店铺里的产品 ASIN 码
function crawlAsin(page) {
  if (page > 1) {
    // 最多只爬取前10页数据，避免访问太过频繁被封IP
    console.log(`共抓取到 ${urls.length} 条商品记录`);
    crawlProducts(urls); // 开始从详情页面爬取具体数据
  } else {
    setTimeout(() => {
      request(
        {
          url: `${storeUrl}&page=${page}`,
          gzip: true, // 启用gzip解压
          encoding: null, // 返回一个Buffer对象而不是字符串
          headers: {
            "User-Agent":
              "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0",
            Accept: "*/*",
            "Accept-Language": "en-US,en;q=0.5",
            "Content-Language": "en-US",
            "Content-Type": "text/html;charset=UTF-8",
            Connection: "keep-alive",
          },
        },
        function (error, response, html) {
          console.log(`${storeUrl}&page=${page}`, response.statusCode);
          if (!error && response.statusCode === 200) {
            const $ = cheerio.load(html);

            let results = $(".s-result-list > [data-asin]"); // 获取每个包含ASIN编号的 div 元素
            if (results.length === 0) {
              console.log("未找到满足条件的商品"); // 没有搜索结果，可以处理一下此情况
            }
            results.each((i, elem) => {
              let asin = $(elem).attr("data-asin"); // 使用 attr() 方法来获取 data-asin 属性值
              if (asin) {
                urls.push(asin);
              }
            });

            crawlAsin(page + 1); // 继续爬取下一页的链接
          } else {
            console.log(`获取第 ${page} 页失败`);
          }
        }
      );
    }, Math.floor(Math.random() * (1500 - 500) + 500));
  }
}

// 从亚马逊产品页面上解析出需要的信息
function crawlProducts(urls) {
  let rowCount = 2;

  function crawl(i) {
    if (i >= urls.length) {
      // 爬取结束，退出程序
      console.log("所有数据爬取完毕");
      process.exit();
    } else {
      setTimeout(() => {
        request(
          {
            url: `https://www.amazon.com/dp/${urls[i]}`,
            gzip: true, // 启用gzip解压
            encoding: null, // 返回一个Buffer对象而不是字符串
            headers: {
              "User-Agent":
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0",
              "Accept-Language": "en-US,en;q=0.5",
              "Content-Language": "en-US",
              "Content-Type": "text/html;charset=UTF-8",
              "Accept-Encoding": "gzip, deflate, br",
            },
          },
          function (error, response, html) {
            if (!error && response.statusCode === 200) {
              const $ = cheerio.load(html);
              const product_name = $("#productTitle").text().trim();
              const product_price = $(".a-price .a-offscreen").text(); // 获取标签文本内容
              const main_image =
                $(".a-button-thumbnail").find("img")[0] &&
                $(".a-button-thumbnail").find("img")[0].attribs.src;
              console.log(product_name, product_price, main_image);

              // 将抓到的数据写入Excel文件和MySQL数据库
              xlsx
                .fromFileAsync("products.xlsx")
                .then((workbook) => {
                  const sheet = workbook.sheet(0);
                  sheet.row(rowCount).cell(1).value(urls[i]);
                  sheet.row(rowCount).cell(2).value(product_name);
                  sheet.row(rowCount).cell(3).value(product_price);
                  sheet.row(rowCount).cell(4).value(main_image);
                  return workbook.toFileAsync("products.xlsx");
                })
                .then(() => {
                  console.log(`第 ${i + 1} 条数据已经成功写入Excel文件`);
                })
                .catch((err) => console.error(err.stack));

              rowCount++;
              crawl(i + 1); // 继续爬取下一个链接
            } else {
              console.log(`获取 https://www.amazon.com/dp/${urls[i]} 页面失败`);

              crawl(i + 1); //继续爬取下一个链接
            }
          }
        );
      }, Math.floor(Math.random() * (1500 - 500) + 500));
    }
  }

  const asins = urls.slice(); // 复制一份 ASIN 码数组并存储到局部变量中

  crawl(0); // 开始从亚马逊产品页面上抓取详细信息
}

// crawlAsin(1); // 开始从亚马逊店铺里抓取产品详细信息，并写入到 Excel 文件中。

crawlProducts(urls);
